Rotting oranges¶
Time: O(MxN); Space: O(MxN); easy
In a given grid, each cell can have one of three values: * the value 0 representing an empty cell; * the value 1 representing a fresh orange; * the value 2 representing a rotten orange.
Every minute, any fresh orange that is adjacent (4-directionally) to a rotten orange becomes rotten.
Return the minimum number of minutes that must elapse until no cell has a fresh orange. If this is impossible, return -1 instead.
Example 1:
Input: grid = [[2,1,1],[1,1,0],[0,1,1]]
Output: 4
Example 2:
Input: grid = [[2,1,1],[0,1,1],[1,0,1]]
Output: -1
Explanation:
The orange in the bottom left corner (row 2, column 0) is never rotten, because rotting only happens 4-directionally.
Example 3:
Input: grid = [[0,2]]
Output: 0
Explanation:
Since there are already no fresh oranges at minute 0, the answer is just 0.
Notes:
1 <= len(grid) <= 10
1 <= len(grid[0]) <= 10
grid[i][j] is only 0, 1, or 2.
[1]:
import collections
class Solution1(object):
"""
Time: O(m * n)
Space: O(m * n)
"""
def orangesRotting(self, grid):
"""
:type grid: List[List[int]]
:rtype: int
"""
directions = [(0, 1), (1, 0), (0, -1), (-1, 0)]
count = 0
q = collections.deque()
for r, row in enumerate(grid):
for c, val in enumerate(row):
if val == 2:
q.append((r, c, 0))
elif val == 1:
count += 1
result = 0
while q:
r, c, result = q.popleft()
for d in directions:
nr, nc = r + d[0], c + d[1]
if not (0 <= nr < len(grid) and \
0 <= nc < len(grid[r])):
continue
if grid[nr][nc] == 1:
count -= 1
grid[nr][nc] = 2
q.append((nr, nc, result+1))
return result if count == 0 else -1
[2]:
s = Solution1()
grid = [[2,1,1],[1,1,0],[0,1,1]]
assert s.orangesRotting(grid) == 4
grid = [[2,1,1],[0,1,1],[1,0,1]]
assert s.orangesRotting(grid) == -1
grid = [[0,2]]
assert s.orangesRotting(grid) == 0